自己定义控件时经常遇到重写View的draw()方法,draw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的。 save():用来保存canvas的状态,save()方法之后的代码,能够调用canvas的平移、放缩、旋转、裁剪等操作!restore():用来恢复canvas之前保存的状态,防止save()方法代码之后对canvas运行的操作。继续对兴许的绘制会产生影响。通过该方法能够避免连带的影响! public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GREEN);
//canvas变换操作不会对前面造成影响
canvas.clipRect(new Rect(100, 200, 500, 500));
canvas.drawColor(Color.BLUE);
}
}
复制代码 canvas.drawColor(Color.GREEN);
//canvas变换操作不会对前面造成影响
canvas.clipRect(new Rect(100, 200, 500, 500));
canvas.drawColor(Color.BLUE);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(200,200,500,paint);
复制代码 我们发现canvas裁剪产生的画布,绘制,不会对非裁剪的区域造成影响。canvas.drawColor(Color.GREEN);
//保存画布当前的状态(保存到画布栈里面了)
canvas.save();
//canvas变换操作不会对前面造成影响
canvas.clipRect(new Rect(100, 100, 500, 500));
canvas.drawColor(Color.BLUE);
//恢复画布
canvas.restore();
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(100, 100, 100, paint);
复制代码 canvas.drawColor(Color.GREEN);
//保存画布当前的状态
canvas.save();
//canvas变换操作不会对前面造成影响
canvas.clipRect(new Rect(100, 100, 500, 500));
canvas.drawColor(Color.BLUE);
canvas.save();
//恢复画布
//canvas.restore();
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(100, 100, 100, paint);
canvas.restore();
paint.setColor(Color.YELLOW);
canvas.drawCircle(150,150,100,paint);
复制代码 结论:画板是以栈的形式进行存储搜索动画实际案例public abstract class BaseController {
public static final int STATE_ANIM_NONE = 0;
public static final int STATE_ANIM_START = 1;
public static final int STATE_ANIM_STOP = 2;
public static final int DEFAULT_ANIM_TIME = 5000;
public static final float DEFAULT_ANIM_STARTF = 0;
public static final float DEFAULT_ANIM_ENDF = 1;
private MySearchView mySearchView;
public int mState = STATE_ANIM_NONE;
public abstract void draw(Canvas canvas,Paint paint);
public void startAnim(){
}
public void resetAnim(){
}
public int getWidth(){
return mySearchView.getWidth();
}
public int getHeight(){
return mySearchView.getHeight();
}
public void setSearchView(MySearchView mySearchView){
this.mySearchView = mySearchView;
}
public float mpro = -1;
public ValueAnimator startViewAnimation(){
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1);
valueAnimator.setDuration(800L);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mpro = (float) animation.getAnimatedValue();
mySearchView.invalidate();
}
});
valueAnimator.start();
mpro = 0;
return valueAnimator;
}
}
复制代码绘制类 public class Controller1 extends BaseController {
private String mColor = "#4CAF50";
private int cx, cy, cr;
private RectF mRectF;
private int j = 15;
public Controller1() {
mRectF = new RectF();
}
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawColor(Color.parseColor(mColor));
switch (mState) {
case STATE_ANIM_NONE:
drawNormalView(paint, canvas);
break;
case STATE_ANIM_START:
drawStartAnimView(paint, canvas);
break;
case STATE_ANIM_STOP:
// drawNormalView(paint, canvas);
drawStopAnimView(paint, canvas);
break;
}
}
private void drawStopAnimView(Paint paint, Canvas canvas) {
}
private void drawStartAnimView(Paint paint, Canvas canvas) {
canvas.save();
//0~1
if (mpro 更多Android技术分享可以关注@我,也可以加入QQ群号:1078469822,学习交流Android开发技能。 作者:冬日毛毛雨链接:https://juejin.cn/post/7012529789135224840来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|